<?php
namespace User\Service;
use Think\Model;
/**
 * 2022.05.31 huhaiqin
 * 适配App的用户中心
 */
class UsersService extends Model{

    /**
     * huhaiqin , 2023.06.07
     * $redurl 登录返回地址
     * 
     */
    public function _login($username = '',$password = '',$redurl = ''){
        if(!$username){
            _apiReturn(0,'用户名或邮箱不能为空~');
        }
        if(!$password){
            _apiReturn(0,'密码不能为空~');
        }
        //检测username是否为邮箱
        if(check_email($username)){
            $map = [
                'email' => $username,
                'password' => md5($password)
            ];
        }else{
            $map = [
                'username' => $username,
                'password' => md5($password)
            ];
        }
        $user = $this->where($map)->find();
        if (!$user) {
            _apiReturn(0, '用户名或密码错误~');
        } else {
            if($user['status'] != 1){
                _apiReturn(0, '该账号已被禁用');
            }
            unset($user['password']);
            $user['config'] = json_decode($user['config'],true); // 转一下config的格式
            session('loginUser', $user); //登录状态写入session
            _apiReturn(1, 'Success',$user,$redurl ? $redurl : '/home/index/my.html'); //默认返回首页 
        }
    }

    /**
     * xqx，2023.06.12
     * 用户注册
     */
    public function _reg($username = '',$email = '',$password = '',$code = '',$redurl = '') {
        if(trim($email) == ''){
            _apiReturn(0,'邮箱不能为空~');
        }
        if(trim($username) == ''){
            _apiReturn(0,'用户名不能为空~');
        }
        if(trim($password) == ''){
            _apiReturn(0,'密码不能为空~');
        }
        if(trim($code) == ''){
            _apiReturn(0,'验证码不能为空~');
        }

        //检测用户名、邮箱是否已注册
		$res = $this->_check_update_user(['id'=>0,'username'=>$username,'email'=>$email]); //检测用户名、邮箱是否已注册
        if($res){
            //检验验证码是否正确
            D("Api/Email")->_check_code($email,$code);
            //获取用户IP
            $ip = get_client_ip();
            //获取IP定位信息
            $dataStr = file_get_contents("http://ip-api.com/json/".$ip);
            $ret = json_decode($dataStr,true);
            $user = [
                'username' => $username,
                'email' => $email,
                'password' => md5($password),
                'country'  => $ret['country'] ? $ret['country'] : '',   //国家
                'province'  => $ret['regionName'] ? $ret['regionName'] : '',    //省、州地区
                'city'  => $ret['city']?$ret['city']:'',    //城市
                'create_time' => time(),
                'update_time' => time()
            ];
            if($this->add($user)){
                _apiReturn(1,'Register Success',[],$redurl ? $redurl : '/home/user/login.html'); //默认返回登录页面
            }else{
                _apiReturn(0,'Register Fail');
            }
        }
	}

    /**
     * xqx，2023.06.13
     * 用户通过验证码登录
     * $redurl:登录成功攻返回的页面，默认是重置密码页面
     */
    public function _login_by_code($email = '', $code = '',$redurl = ''){
        if(trim($email) == ''){
            _apiReturn(0,'邮箱不能为空~');
        }
        if(trim($code) == ''){
            _apiReturn(0,'验证码不能为空~');
        }
        //检验验证码是否正确
        D("Api/Email")->_check_code($email,$code,'findpwd');
        $user = $this->where(['email'=>$email])->find();
        if (!$user) {
            _apiReturn(0, '用户名不存在~');
        } else {
            if($user['status'] != 1){
                _apiReturn(0, '该账号已被禁用');
            }
            unset($user['password']);
            $user['config'] = json_decode($user['config'],true); // 转一下config的格式
            session('loginUser', $user); //登录状态写入session
            _apiReturn(1, 'Success',[],$redurl ? $redurl : '/home/user/repwd.html?type=reset'); //默认返回重置密码页面
        }
    }

    /**
     * xqx,2023.0613
     * 前端用户修改/重置密码
     * param $op：默认为空，修改密码；值为reset，重置密码
     */
    public function _repwd($oldpwd = '',$newpwd = '', $repwd = '', $uid = '', $op = ''){
        if($op=='' && $oldpwd==''){
            _apiReturn(0,'原密码必须');
        }
        if($newpwd==''||$repwd==''){
            _apiReturn(0,'新密码必须');
        }
        if($newpwd!=$repwd){
            _apiReturn(0,'两次密码不一致');
        }
        if(!$op){
            //修改密码时，检测原密码是否正确
            $check = $this->where(['id' => $uid, 'password' => md5($oldpwd)])->find();
            if (!$check) {
                _apiReturn(0, '原密码错误，请检查~');
            }
        }
        if ($this->save(['id' => $uid, 'password' => md5($newpwd), 'update_time' => time()])) {
            if($op=='reset'){
                _apiReturn(1, '密码重置成功~',[],'/home/index/my.html');
            }
            _apiReturn(1, '密码修改成功~');
        } else {
            _apiReturn(0, '系统错误，密码修改失败');
        }
    }

    /**
     * 姓名首字母，生成用户名
     */
    public function _create_username($py,$i=0){
        if(!$i) $i = 0;
        if($i > 4){
			$var = rand(00000, 99999);
			$num=sprintf("%05d", $var);
		}else{
			$var = rand(0000, 9999);
			$num=sprintf("%04d", $var);
        }
        $username = $py.$num;
        $check = $this->where(['username'=>$username])->find();
        if($check){
            $this->_create_username($py,$i+1); //递归创建用户名
        }else{
            return $username;
        }
    }

    /**
     * 获取名字拼音首字母
     */
    function getNameFirstCharter($name){
        $ret = '';
        $names = $this->utf8_str_split($name,1);
        
        foreach($names as $n){
            
            $ret .= $this->getFirstCharter($n);
            
        }
        
        return strtolower($ret);
    }
    /**
     * 获取中文首字母
     */
    function getFirstCharter($str){
        
	    if(empty($str)) {return '';}
	    $fchar=ord($str{0});
	    if($fchar>=ord('A')&&$fchar<=ord('z')) return strtoupper($str{0});
	    $s1=iconv('UTF-8','gb2312',$str);
	    $s2=iconv('gb2312','UTF-8',$s1);
	    $s=$s2==$str?$s1:$str;
        $asc = ord($s{0})*256 + ord($s{1})-65536;
	    if($asc>=-20319&&$asc<=-20284) return 'A';
	    if($asc>=-20283&&$asc<=-19776 || $asc==-9743) return 'B';
	    if($asc>=-19775&&$asc<=-19219) return 'C';
	    if($asc>=-19218&&$asc<=-18711 || $asc==-9767) return 'D';
	    if($asc>=-18710&&$asc<=-18527) return 'E';
	    if($asc>=-18526&&$asc<=-18240) return 'F';
	    if($asc>=-18239&&$asc<=-17923) return 'G';
	    if($asc>=-17922&&$asc<=-17418) return 'H';
	    if($asc>=-17417&&$asc<=-16475) return 'J';
	    if($asc>=-16474&&$asc<=-16213) return 'K';
	    if($asc>=-16212&&$asc<=-15641 || $asc==-7182 || $asc==-6928 ) return 'L';
	    if($asc>=-15640&&$asc<=-15166) return 'M';
	    if($asc>=-15165&&$asc<=-14923) return 'N';
	    if($asc>=-14922&&$asc<=-14915) return 'O';
	    if($asc>=-14914&&$asc<=-14631 || $asc==-6745) return 'P';
	    if($asc>=-14630&&$asc<=-14150 || $asc==-7703) return 'Q';
	    if($asc>=-14149&&$asc<=-14091) return 'R';
	    if($asc>=-14090&&$asc<=-13319) return 'S';
	    if($asc>=-13318&&$asc<=-12839) return 'T';
	    if($asc>=-12838&&$asc<=-12557 || $asc==-8527) return 'W';
	    if($asc>=-12556&&$asc<=-11848) return 'X';
	    if($asc>=-11847&&$asc<=-11056) return 'Y';
	    if($asc>=-11055&&$asc<=-10247) return 'Z';
	    return null;
    }
    
    /**
     * 分割utf8字符串
     */
    function utf8_str_split($str, $split_len = 1){
        if (!preg_match('/^[0-9]+$/', $split_len) || $split_len < 1)
            return FALSE;
        $len = mb_strlen($str, 'UTF-8');
        if ($len <= $split_len)
            return array($str);
        preg_match_all('/.{'.$split_len.'}|[^x00]{1,'.$split_len.'}$/us', $str, $ar);
        return $ar[0];
    }

    /**
     * 类自有函数，检测数据中是否可以合法添加用户
     * 如果id为0，表示执行的是添加操作，如果不是0，则表示执行的是修改操作
     * 20200916，haiqin，修补原来留下的bug
     */
    private function _check_update_user($data = [])
    {
        //检测用户名
        if ($data['username'] != '') {
            $user = $this->where(['username' => $data['username']])->find();
            if ($user) {
                if ($data['id'] != 0) {
                    if ($user['id'] != $data['id']) {
                        _apiReturn(0, '用户名已经存在，请换一个用户名~');
                    }
                } else {
                    _apiReturn(0, '用户名已经存在，请换一个用户名~');
                }
            }
        }
        //检测手机号码
        if ($data['mobile'] != '') {
            $user = $this->where(['mobile' => $data['mobile']])->find();
            if ($user) {
                if ($data['id'] != 0) {
                    if ($user['id'] != $data['id']) {
                        _apiReturn(0, '手机号码已经存在~');
                    }
                } else {
                    _apiReturn(0, '手机号码已经存在~');
                }
            }
        }
        //检测email
        if ($data['email'] != '') {
            
            $user = $this->where(['email' => $data['email']])->find();
            // _apiReturn(0,'111',$data);
            if ($user) {
                if ($data['id'] != 0) {
                    if ($user['id'] != $data['id']) {
                        _apiReturn(0, '邮箱已经被注册~');
                    }
                } else {
                    _apiReturn(0, '邮箱已经被注册~');
                }
            }
        }
        return true;
    }


}